package com.ease.concurrent.volat;

import java.util.concurrent.CountDownLatch;

/**
 * volatile关键字语义规范：
 * 1、使用volatile变量时，必须重新从主内存加载，并且read、load是连续的。
 * 2、修改volatile变量时，必须立马写回内存中，并且store, write是连续的。
 *
 * volatile能做到线程安全吗？
 * 1、不能，因为它没有锁机制，线程可并发操作共享资源。
 *
 *
 *
 * @author: chenhs
 * @date: Created in 6:47 2019/11/6
 **/
public class AtomicityDemo {

    static volatile int count = 0;


    public static void increase() {
        count++;
    }

    public static void main(String[] args) {
        int threads = 20;

        //倒计数锁存器
        CountDownLatch cdl = new CountDownLatch(threads);
        for (int i = 0; i < threads; i++) {
            new Thread(()->{
                for (int j = 0; j < 10000; j++) {
                    AtomicityDemo.increase();
                }
                cdl.countDown();
            }).start();
        }

        try {
            cdl.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(AtomicityDemo.count);


    }


}
